package com.xltq.service.impl;

import com.xltq.dao.IUserDao;
import com.xltq.dao.impl.IUserDaoImpl;
import com.xltq.entity.User;
import com.xltq.service.IUserService;
import com.xltq.utils.Constants;
import com.xltq.utils.EmailUtils;
import com.xltq.utils.MD5Utils;

import java.util.Objects;

public class IUserServiceImpl implements IUserService {
    //主要实现注册逻辑实现
    //提供一个操作dao层对象
    IUserDao userDao = new IUserDaoImpl();
    @Override
    public boolean checkeUser(String username) throws Exception {
        //1.通过用户查询用信息
        User user = userDao.selectUserbyName(username);
        //2.判断用user对象是否为null 即可得知用户名是否可用
        if(Objects.nonNull(user)){
            //证明用户名已经存在
            return  true;
        }
        //证明用户名不存在
        return false;
    }

    @Override
    public int registerUser(User user) throws Exception {
        //1.通过dao层操作将用户数据存储在数据库中
        int rows = userDao.insertUser(user);
        //上面语句正常执行就证明 用户是可以正常注册即存储到数据库中User表中
        //2.发送一封邮件
        EmailUtils.sendEmail(user);
        return rows;
    }

    @Override
    public int activeUser(String code) throws Exception {
        //1.通过code参数获取user对象数据
        User user = userDao.selectUserByCode(code);
        //既然可以在Constants中存激活数据常量 那么也可以将激活状态修改为定义常量
        //1.如果用户为空(激活码查询出来的是一个空对象)
        //在Constants中定义了三个激活状态常量
        if(Objects.isNull(user)){
            return Constants.ACTIVE_FAIL;
        }
        //2.判断当前对象是否被激活
        if(user.getUstatus().equals(Constants.USER_ACTIVE)){
            //证明对象已经激活了
            return  Constants.ACTIVE_ALREADY;
        }
        //证明对象存在并且还没有激活,调用Dao层凑操作处理激活
        int rows = userDao.updateStatusByUid(user.getUid());
        //判断受影响函数
        if(rows > 0){
            return  Constants.ACTIVE_SUCCESS;//激活成功
        }

        //默认情况下认为是激活失败
        return  Constants.ACTIVE_FAIL;
    }

    @Override
    public User login(String username, String password) throws Exception {
        //1.需要使用md5将密码进行加密处理
        String md5password = MD5Utils.md5(password);
        //2.根据dao层中通过以用户名获取对象的方式查询User数据
        User user = userDao.selectUserbyName(username);
        if(Objects.nonNull(user) && user.getUpassword().equals(md5password)){
            return user;
        }
        return null;
    }
}
